Skip to content

chore: more concise comments - #2790

Merged
Tofel merged 5 commits into
dx-5122-alerts-assertion-p11from
dx-5122-alerts-assertion-p12
Sep 9, 2026
Merged

chore: more concise comments#2790
Tofel merged 5 commits into
dx-5122-alerts-assertion-p11from
dx-5122-alerts-assertion-p12

Conversation

@Tofel

@Tofel Tofel commented Sep 1, 2026

Copy link
Copy Markdown
Contributor

Comment-only cleanup across the package (40 files): removes stale §-section references from comments and error messages, condenses verbose prose, and deduplicates. No functional changes.

Review focus: error message strings that dropped their § refs — confirm none are asserted elsewhere.

@github-actions

github-actions Bot commented Sep 1, 2026

Copy link
Copy Markdown

⚠️ API Diff Results - github.com/smartcontractkit/chainlink-testing-framework/grafana-alertcheck

⚠️ Breaking Changes (1)

package github (1)
  • com/smartcontractkit/chainlink-testing-framework/grafana-alertcheck/cmd/grafana-alertcheck — 🗑️ Removed

✅ Compatible Changes (1)

package github (1)
  • com/smartcontractkit/chainlink-testing-framework/grafana-alertcheck/cmd — ➕ Added

📄 View full apidiff report

@Tofel
Tofel force-pushed the dx-5122-alerts-assertion-p11 branch from 658d3de to ea8e035 Compare September 1, 2026 11:25
@Tofel
Tofel force-pushed the dx-5122-alerts-assertion-p12 branch from f079183 to b8c24f4 Compare September 1, 2026 11:25
@Tofel
Tofel force-pushed the dx-5122-alerts-assertion-p11 branch from ea8e035 to 44ded19 Compare September 1, 2026 14:18
@Tofel
Tofel force-pushed the dx-5122-alerts-assertion-p12 branch 2 times, most recently from 7b1a505 to 69d5193 Compare September 1, 2026 14:46
@Tofel
Tofel force-pushed the dx-5122-alerts-assertion-p11 branch 2 times, most recently from 3efbb2f to 7a0caf2 Compare September 1, 2026 15:25
@Tofel
Tofel force-pushed the dx-5122-alerts-assertion-p12 branch from 69d5193 to 0da12c7 Compare September 1, 2026 15:25
@Tofel
Tofel force-pushed the dx-5122-alerts-assertion-p11 branch from 7a0caf2 to ceb8796 Compare September 2, 2026 09:45
@Tofel
Tofel force-pushed the dx-5122-alerts-assertion-p12 branch 2 times, most recently from b6c0dda to 641701b Compare September 2, 2026 09:57
@Tofel
Tofel force-pushed the dx-5122-alerts-assertion-p11 branch 2 times, most recently from c8f7e00 to df94923 Compare September 2, 2026 11:05
@Tofel
Tofel force-pushed the dx-5122-alerts-assertion-p12 branch from 641701b to 03eb0f1 Compare September 2, 2026 11:05
@Tofel
Tofel force-pushed the dx-5122-alerts-assertion-p11 branch from df94923 to 159d0b6 Compare September 2, 2026 11:23
@Tofel
Tofel force-pushed the dx-5122-alerts-assertion-p12 branch from 03eb0f1 to 788c7ae Compare September 2, 2026 11:23
@Tofel
Tofel force-pushed the dx-5122-alerts-assertion-p11 branch from 159d0b6 to ff03422 Compare September 4, 2026 15:03
@Tofel
Tofel force-pushed the dx-5122-alerts-assertion-p12 branch 2 times, most recently from 6f766ca to 803f45f Compare September 4, 2026 15:15
@Tofel
Tofel force-pushed the dx-5122-alerts-assertion-p11 branch 2 times, most recently from 007deb1 to 3aada1e Compare September 7, 2026 09:35
@Tofel
Tofel force-pushed the dx-5122-alerts-assertion-p12 branch from 803f45f to 7a37ee3 Compare September 7, 2026 09:35
@Tofel
Tofel marked this pull request as ready for review September 7, 2026 09:37
@Tofel
Tofel requested a review from a team as a code owner September 7, 2026 09:37
Copilot AI lite review requested due to automatic review settings September 7, 2026 09:37

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟢 Approval recommended

Changes are limited to comment and error-message text cleanup with corresponding test updates, and no behavioral logic changes were identified.

Pull request overview

This PR performs a comment and user-facing error-string cleanup in the grafana-alertcheck gate implementation, removing stale section-reference markers (e.g., §...) and condensing verbose explanatory prose while keeping behavior unchanged.

Changes:

  • Condense and deduplicate in-code documentation across the gate’s record/watch, parse, schedule, coverage, and classification layers.
  • Simplify several error message strings (notably removing §/H* references) and update tests to assert on the new wording.
  • Clarify CLI help text and table-rendering comments to better describe operator-facing output without referencing external plan sections.
File summaries
File Description
grafana-alertcheck/internal/gate/watch.go Comment condensation in watch/daemon lifecycle docs; minor wording adjustments.
grafana-alertcheck/internal/gate/watch_test.go Test comment cleanup; updates to assertions that previously looked for section markers in error strings.
grafana-alertcheck/internal/gate/watch_process.go Comment cleanup around detached child spawning and readiness pipe.
grafana-alertcheck/internal/gate/watch_daemon_test.go Comment cleanup for daemon-child integration test harness.
grafana-alertcheck/internal/gate/testdata/README.md Documentation cleanup for fixture provenance/coverage explanations.
grafana-alertcheck/internal/gate/source.go Comment cleanup plus error-string text changes for Date header and skew hard-limit failures.
grafana-alertcheck/internal/gate/source_test.go Test message updates to match revised error-string wording and commentary cleanup.
grafana-alertcheck/internal/gate/source_fake_test.go Comment condensation for fake clock/source test doubles.
grafana-alertcheck/internal/gate/schedule.go Comment cleanup for timing derivations and scheduler invariants.
grafana-alertcheck/internal/gate/schedule_test.go Test comment cleanup; preserves behavioral assertions.
grafana-alertcheck/internal/gate/resolve.go Comment cleanup for name-resolution rules/policy.
grafana-alertcheck/internal/gate/resolve_test.go Test comment cleanup around resolution/collapse behavior.
grafana-alertcheck/internal/gate/parse_state.go Comment cleanup around strict parsing requirements and invariants.
grafana-alertcheck/internal/gate/parse_state_test.go Test comment cleanup and minor wording adjustments in messages.
grafana-alertcheck/internal/gate/parse_ruler.go Comment cleanup clarifying rule-kind handling and parsing scope.
grafana-alertcheck/internal/gate/parse_ruler_test.go Test comment cleanup; clarifies uid-based disambiguation rationale.
grafana-alertcheck/internal/gate/log.go Comment cleanup for log schema semantics, marker logic, and invariants.
grafana-alertcheck/internal/gate/log_test.go Test comment cleanup; updates assertions that previously required section markers in messages.
grafana-alertcheck/internal/gate/jsonreq.go Comment cleanup for required-field decoding behavior.
grafana-alertcheck/internal/gate/flock.go Comment cleanup for flock semantics in writer detection.
grafana-alertcheck/internal/gate/duration.go Comment cleanup for Prometheus-style duration parsing.
grafana-alertcheck/internal/gate/coverage.go Comment cleanup for coverage proof responsibilities and check descriptions; updates KeepLast note text.
grafana-alertcheck/internal/gate/coverage_test.go Test comment/message cleanup to match updated coverage messaging.
grafana-alertcheck/internal/gate/classify.go Comment cleanup around policy, outcomes, and decide() responsibilities.
grafana-alertcheck/internal/gate/classify_test.go Test comment/message cleanup for classification and decide() behavior.
grafana-alertcheck/internal/gate/check_test.go Test comment/message cleanup around validation, failure modes, and expectations.
grafana-alertcheck/internal/gate/check_process.go Comment cleanup for recorder signaling.
grafana-alertcheck/cmd/grafana-alertcheck/watch.go CLI-layer comment cleanup describing parent/child dispatch and daemon-child entrypoint.
grafana-alertcheck/cmd/grafana-alertcheck/watch_test.go CLI watch tests: comment cleanup for validation/dispatch coverage.
grafana-alertcheck/cmd/grafana-alertcheck/table.go Comment cleanup clarifying stderr/stdout contract and rendered table sections.
grafana-alertcheck/cmd/grafana-alertcheck/table_test.go Golden-output test comment cleanup; keeps assertions intact.
grafana-alertcheck/cmd/grafana-alertcheck/main.go Top-level CLI comment cleanup describing subcommands and exit-code responsibilities.
grafana-alertcheck/cmd/grafana-alertcheck/list.go Comment cleanup clarifying list’s role as operator surface and validation path.
grafana-alertcheck/cmd/grafana-alertcheck/env.go Comment cleanup reinforcing env-only secret handling.
grafana-alertcheck/cmd/grafana-alertcheck/common.go Comment/help-text cleanup for shared flags and state parsing.
grafana-alertcheck/cmd/grafana-alertcheck/check.go CLI check help-text and comment cleanup; removes section references from user messages.
grafana-alertcheck/cmd/grafana-alertcheck/check_test.go CLI check tests: comment/message cleanup; keeps exit-code mapping assertions aligned.
Review details
  • Files reviewed: 38/38 changed files
  • Comments generated: 1
  • Review effort level: Lite

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment thread grafana-alertcheck/internal/gate/watch.go
@Tofel
Tofel force-pushed the dx-5122-alerts-assertion-p12 branch from 7a37ee3 to f4df0d5 Compare September 7, 2026 09:46
@Tofel
Tofel force-pushed the dx-5122-alerts-assertion-p11 branch from 00721ca to d928633 Compare September 7, 2026 15:02
@Tofel
Tofel force-pushed the dx-5122-alerts-assertion-p12 branch from f4df0d5 to 34040df Compare September 7, 2026 15:02
@Tofel
Tofel removed this pull request from stack #2791 September 9, 2026 09:52
@Tofel Tofel closed this Sep 9, 2026
@Tofel Tofel reopened this Sep 9, 2026
* chore: use testify's require in tests

* chore: move remaining assumptions to testify

* chore: address code review comments

* chore: fix logging and std out printing (#2798)

* chore: fix logging and std out printing

* chore: truncate to seconds when comparing from time

* chore: add centralized docs (#2802)

* chore: add centralized docs

* chore: further update docs

* chore: address code review comments (#2807)

* chore: address code review comments

* chore: get rid of goreleaser
@Tofel
Tofel merged commit cf8508b into dx-5122-alerts-assertion-p11 Sep 9, 2026
44 of 52 checks passed
@Tofel
Tofel deleted the dx-5122-alerts-assertion-p12 branch September 9, 2026 09:57
Tofel added a commit that referenced this pull request Sep 9, 2026
* chore: implement phase 11

Add coverage.go's declared-KeepLast check (no_data_state/exec_err_state,
not just an observed reason) and close the remaining §22 gaps: newly_bad's
no-early-exit clock assertion, a recorder-mode gap right after the deploy,
a rule's own coverage gap overriding its own recovery, a genuinely
skew-discriminating staleness test, exit-2 consequences on two
Reason-only coverage tests, and end-to-end checks for log-name
collapse, a truncated log, and the real watch-written state histogram.

* chore: address code review comments

* chore: more concise comments (#2790)

* chore: more concise comments

* fix: merge conflict

* chore: shorten comments

* fix: resolve conflict

* chore: use testify's require in tests (#2792)

* chore: use testify's require in tests

* chore: move remaining assumptions to testify

* chore: address code review comments

* chore: fix logging and std out printing (#2798)

* chore: fix logging and std out printing

* chore: truncate to seconds when comparing from time

* chore: add centralized docs (#2802)

* chore: add centralized docs

* chore: further update docs

* chore: address code review comments (#2807)

* chore: address code review comments

* chore: get rid of goreleaser
Tofel added a commit that referenced this pull request Sep 9, 2026
* Wire watch/check subcommands to the gate library, with a table+JSON
renderer and H6/H7 exit-code mapping. Extend Result with per-rule/global
thresholds and a real skew bound; export SkewHardLimit; reject --states
normal.

* chore: fix goreleaser.yaml and add version command

* chore: implement phase 11 (#2789)

* chore: implement phase 11

Add coverage.go's declared-KeepLast check (no_data_state/exec_err_state,
not just an observed reason) and close the remaining §22 gaps: newly_bad's
no-early-exit clock assertion, a recorder-mode gap right after the deploy,
a rule's own coverage gap overriding its own recovery, a genuinely
skew-discriminating staleness test, exit-2 consequences on two
Reason-only coverage tests, and end-to-end checks for log-name
collapse, a truncated log, and the real watch-written state histogram.

* chore: address code review comments

* chore: more concise comments (#2790)

* chore: more concise comments

* fix: merge conflict

* chore: shorten comments

* fix: resolve conflict

* chore: use testify's require in tests (#2792)

* chore: use testify's require in tests

* chore: move remaining assumptions to testify

* chore: address code review comments

* chore: fix logging and std out printing (#2798)

* chore: fix logging and std out printing

* chore: truncate to seconds when comparing from time

* chore: add centralized docs (#2802)

* chore: add centralized docs

* chore: further update docs

* chore: address code review comments (#2807)

* chore: address code review comments

* chore: get rid of goreleaser
Tofel added a commit that referenced this pull request Sep 9, 2026
* chore: implement phase 9

Invariant defended: H5/H7. The one question: can check report a pass
over a window it did not prove?

Check() is the I/O shell around the pure decide(). Single-step
synthesizes the header and its own sentinel, so no mode flag reaches
the pure layer. Log mode stops the recorder before the one full read.

The header, not a definition re-resolved after the window closed, is
the authority for what was paused when the window opened — it decides
`skipped`, the drain set, and the transitionGrace max. The flock, not
the pidfile, is the authority for whether a writer still exists.

* chore: remove unix build tag

* chore: implement phase 10 (#2788)

* Wire watch/check subcommands to the gate library, with a table+JSON
renderer and H6/H7 exit-code mapping. Extend Result with per-rule/global
thresholds and a real skew bound; export SkewHardLimit; reject --states
normal.

* chore: fix goreleaser.yaml and add version command

* chore: implement phase 11 (#2789)

* chore: implement phase 11

Add coverage.go's declared-KeepLast check (no_data_state/exec_err_state,
not just an observed reason) and close the remaining §22 gaps: newly_bad's
no-early-exit clock assertion, a recorder-mode gap right after the deploy,
a rule's own coverage gap overriding its own recovery, a genuinely
skew-discriminating staleness test, exit-2 consequences on two
Reason-only coverage tests, and end-to-end checks for log-name
collapse, a truncated log, and the real watch-written state histogram.

* chore: address code review comments

* chore: more concise comments (#2790)

* chore: more concise comments

* fix: merge conflict

* chore: shorten comments

* fix: resolve conflict

* chore: use testify's require in tests (#2792)

* chore: use testify's require in tests

* chore: move remaining assumptions to testify

* chore: address code review comments

* chore: fix logging and std out printing (#2798)

* chore: fix logging and std out printing

* chore: truncate to seconds when comparing from time

* chore: add centralized docs (#2802)

* chore: add centralized docs

* chore: further update docs

* chore: address code review comments (#2807)

* chore: address code review comments

* chore: get rid of goreleaser
Tofel added a commit that referenced this pull request Sep 9, 2026
* chore: implement phase 8

Invariant defended: H6/H7. The one question: can a violation ever
outrank an unobservable rule, or can a pass happen without
Violations empty and err nil?

Adds classify.go: the pure per-instance classifier (outcome table,
preexisting policy, BadFor) and decide(), the seam combining
proveCoverage with those timelines under one Policy. Consolidates
rule-poll filtering and skew translation onto pollsForRule/runnerTime,
shared with coverage.go.

* chore: rename some vars + add unit tests

* chore: address code review comments

* chore: implement phase 9 (#2787)

* chore: implement phase 9

Invariant defended: H5/H7. The one question: can check report a pass
over a window it did not prove?

Check() is the I/O shell around the pure decide(). Single-step
synthesizes the header and its own sentinel, so no mode flag reaches
the pure layer. Log mode stops the recorder before the one full read.

The header, not a definition re-resolved after the window closed, is
the authority for what was paused when the window opened — it decides
`skipped`, the drain set, and the transitionGrace max. The flock, not
the pidfile, is the authority for whether a writer still exists.

* chore: remove unix build tag

* chore: implement phase 10 (#2788)

* Wire watch/check subcommands to the gate library, with a table+JSON
renderer and H6/H7 exit-code mapping. Extend Result with per-rule/global
thresholds and a real skew bound; export SkewHardLimit; reject --states
normal.

* chore: fix goreleaser.yaml and add version command

* chore: implement phase 11 (#2789)

* chore: implement phase 11

Add coverage.go's declared-KeepLast check (no_data_state/exec_err_state,
not just an observed reason) and close the remaining §22 gaps: newly_bad's
no-early-exit clock assertion, a recorder-mode gap right after the deploy,
a rule's own coverage gap overriding its own recovery, a genuinely
skew-discriminating staleness test, exit-2 consequences on two
Reason-only coverage tests, and end-to-end checks for log-name
collapse, a truncated log, and the real watch-written state histogram.

* chore: address code review comments

* chore: more concise comments (#2790)

* chore: more concise comments

* fix: merge conflict

* chore: shorten comments

* fix: resolve conflict

* chore: use testify's require in tests (#2792)

* chore: use testify's require in tests

* chore: move remaining assumptions to testify

* chore: address code review comments

* chore: fix logging and std out printing (#2798)

* chore: fix logging and std out printing

* chore: truncate to seconds when comparing from time

* chore: add centralized docs (#2802)

* chore: add centralized docs

* chore: further update docs

* chore: address code review comments (#2807)

* chore: address code review comments

* chore: get rid of goreleaser
Tofel added a commit that referenced this pull request Sep 9, 2026
* chore: implement phase 7

Invariant defended: H3. The one question: can a rule be called alive
because it looked alive one poll ago?

proveCoverage (grafana-alertcheck/internal/gate/coverage.go) is the pure
coverage function: nine checks over one rule's polls — sentinel,
from-bounds, heartbeat continuity, health error/nodata, liveness,
in-window pause, rule absence, KeepLast. Liveness is absolute, never a
delta. Cross-domain comparisons translate by each poll's own skew and
widen boundary segments by its skew bound, fail-closed.

* chore: enhance unit tests

* chore: address code review comments

* chore: implement phase 8 (#2786)

* chore: implement phase 8

Invariant defended: H6/H7. The one question: can a violation ever
outrank an unobservable rule, or can a pass happen without
Violations empty and err nil?

Adds classify.go: the pure per-instance classifier (outcome table,
preexisting policy, BadFor) and decide(), the seam combining
proveCoverage with those timelines under one Policy. Consolidates
rule-poll filtering and skew translation onto pollsForRule/runnerTime,
shared with coverage.go.

* chore: rename some vars + add unit tests

* chore: address code review comments

* chore: implement phase 9 (#2787)

* chore: implement phase 9

Invariant defended: H5/H7. The one question: can check report a pass
over a window it did not prove?

Check() is the I/O shell around the pure decide(). Single-step
synthesizes the header and its own sentinel, so no mode flag reaches
the pure layer. Log mode stops the recorder before the one full read.

The header, not a definition re-resolved after the window closed, is
the authority for what was paused when the window opened — it decides
`skipped`, the drain set, and the transitionGrace max. The flock, not
the pidfile, is the authority for whether a writer still exists.

* chore: remove unix build tag

* chore: implement phase 10 (#2788)

* Wire watch/check subcommands to the gate library, with a table+JSON
renderer and H6/H7 exit-code mapping. Extend Result with per-rule/global
thresholds and a real skew bound; export SkewHardLimit; reject --states
normal.

* chore: fix goreleaser.yaml and add version command

* chore: implement phase 11 (#2789)

* chore: implement phase 11

Add coverage.go's declared-KeepLast check (no_data_state/exec_err_state,
not just an observed reason) and close the remaining §22 gaps: newly_bad's
no-early-exit clock assertion, a recorder-mode gap right after the deploy,
a rule's own coverage gap overriding its own recovery, a genuinely
skew-discriminating staleness test, exit-2 consequences on two
Reason-only coverage tests, and end-to-end checks for log-name
collapse, a truncated log, and the real watch-written state histogram.

* chore: address code review comments

* chore: more concise comments (#2790)

* chore: more concise comments

* fix: merge conflict

* chore: shorten comments

* fix: resolve conflict

* chore: use testify's require in tests (#2792)

* chore: use testify's require in tests

* chore: move remaining assumptions to testify

* chore: address code review comments

* chore: fix logging and std out printing (#2798)

* chore: fix logging and std out printing

* chore: truncate to seconds when comparing from time

* chore: add centralized docs (#2802)

* chore: add centralized docs

* chore: further update docs

* chore: address code review comments (#2807)

* chore: address code review comments

* chore: get rid of goreleaser
Tofel added a commit that referenced this pull request Sep 9, 2026
* chore: implement phase 6

Invariant defended: H2. The one question: can watch return success over a
window that nothing is recording?

Watch() records the first observation of each non-skipped rule, then detaches
a child that polls at the cadence in the header. The parent returns only after
the child reports ready on an inherited pipe, and writes the pidfile after
that. A clean stop writes the sentinel; a hard error does not.

* chore: add a unit test, remove build tags

* chore: address code review comments

* chore: implement phase 7 (#2785)

* chore: implement phase 7

Invariant defended: H3. The one question: can a rule be called alive
because it looked alive one poll ago?

proveCoverage (grafana-alertcheck/internal/gate/coverage.go) is the pure
coverage function: nine checks over one rule's polls — sentinel,
from-bounds, heartbeat continuity, health error/nodata, liveness,
in-window pause, rule absence, KeepLast. Liveness is absolute, never a
delta. Cross-domain comparisons translate by each poll's own skew and
widen boundary segments by its skew bound, fail-closed.

* chore: enhance unit tests

* chore: address code review comments

* chore: implement phase 8 (#2786)

* chore: implement phase 8

Invariant defended: H6/H7. The one question: can a violation ever
outrank an unobservable rule, or can a pass happen without
Violations empty and err nil?

Adds classify.go: the pure per-instance classifier (outcome table,
preexisting policy, BadFor) and decide(), the seam combining
proveCoverage with those timelines under one Policy. Consolidates
rule-poll filtering and skew translation onto pollsForRule/runnerTime,
shared with coverage.go.

* chore: rename some vars + add unit tests

* chore: address code review comments

* chore: implement phase 9 (#2787)

* chore: implement phase 9

Invariant defended: H5/H7. The one question: can check report a pass
over a window it did not prove?

Check() is the I/O shell around the pure decide(). Single-step
synthesizes the header and its own sentinel, so no mode flag reaches
the pure layer. Log mode stops the recorder before the one full read.

The header, not a definition re-resolved after the window closed, is
the authority for what was paused when the window opened — it decides
`skipped`, the drain set, and the transitionGrace max. The flock, not
the pidfile, is the authority for whether a writer still exists.

* chore: remove unix build tag

* chore: implement phase 10 (#2788)

* Wire watch/check subcommands to the gate library, with a table+JSON
renderer and H6/H7 exit-code mapping. Extend Result with per-rule/global
thresholds and a real skew bound; export SkewHardLimit; reject --states
normal.

* chore: fix goreleaser.yaml and add version command

* chore: implement phase 11 (#2789)

* chore: implement phase 11

Add coverage.go's declared-KeepLast check (no_data_state/exec_err_state,
not just an observed reason) and close the remaining §22 gaps: newly_bad's
no-early-exit clock assertion, a recorder-mode gap right after the deploy,
a rule's own coverage gap overriding its own recovery, a genuinely
skew-discriminating staleness test, exit-2 consequences on two
Reason-only coverage tests, and end-to-end checks for log-name
collapse, a truncated log, and the real watch-written state histogram.

* chore: address code review comments

* chore: more concise comments (#2790)

* chore: more concise comments

* fix: merge conflict

* chore: shorten comments

* fix: resolve conflict

* chore: use testify's require in tests (#2792)

* chore: use testify's require in tests

* chore: move remaining assumptions to testify

* chore: address code review comments

* chore: fix logging and std out printing (#2798)

* chore: fix logging and std out printing

* chore: truncate to seconds when comparing from time

* chore: add centralized docs (#2802)

* chore: add centralized docs

* chore: further update docs

* chore: address code review comments (#2807)

* chore: address code review comments

* chore: get rid of goreleaser
Tofel added a commit that referenced this pull request Sep 9, 2026
* chore: implement phase 5

Add the JSONL evidence log (P5).

- log.go: Header/Poll records, reduction, H2 transition markers,
  §3.2 verification, append-only Writer with flock, ReadLog
- flock_unix.go: non-blocking exclusive lock, unix only
- schedule.go: DeriveTimingsFromLog — log-mode cadence comes from the
  header, never from the definitions

* chore: remove unix build tags

* chore: address code review comments

* chore: implement phase 6 (#2784)

* chore: implement phase 6

Invariant defended: H2. The one question: can watch return success over a
window that nothing is recording?

Watch() records the first observation of each non-skipped rule, then detaches
a child that polls at the cadence in the header. The parent returns only after
the child reports ready on an inherited pipe, and writes the pidfile after
that. A clean stop writes the sentinel; a hard error does not.

* chore: add a unit test, remove build tags

* chore: address code review comments

* chore: implement phase 7 (#2785)

* chore: implement phase 7

Invariant defended: H3. The one question: can a rule be called alive
because it looked alive one poll ago?

proveCoverage (grafana-alertcheck/internal/gate/coverage.go) is the pure
coverage function: nine checks over one rule's polls — sentinel,
from-bounds, heartbeat continuity, health error/nodata, liveness,
in-window pause, rule absence, KeepLast. Liveness is absolute, never a
delta. Cross-domain comparisons translate by each poll's own skew and
widen boundary segments by its skew bound, fail-closed.

* chore: enhance unit tests

* chore: address code review comments

* chore: implement phase 8 (#2786)

* chore: implement phase 8

Invariant defended: H6/H7. The one question: can a violation ever
outrank an unobservable rule, or can a pass happen without
Violations empty and err nil?

Adds classify.go: the pure per-instance classifier (outcome table,
preexisting policy, BadFor) and decide(), the seam combining
proveCoverage with those timelines under one Policy. Consolidates
rule-poll filtering and skew translation onto pollsForRule/runnerTime,
shared with coverage.go.

* chore: rename some vars + add unit tests

* chore: address code review comments

* chore: implement phase 9 (#2787)

* chore: implement phase 9

Invariant defended: H5/H7. The one question: can check report a pass
over a window it did not prove?

Check() is the I/O shell around the pure decide(). Single-step
synthesizes the header and its own sentinel, so no mode flag reaches
the pure layer. Log mode stops the recorder before the one full read.

The header, not a definition re-resolved after the window closed, is
the authority for what was paused when the window opened — it decides
`skipped`, the drain set, and the transitionGrace max. The flock, not
the pidfile, is the authority for whether a writer still exists.

* chore: remove unix build tag

* chore: implement phase 10 (#2788)

* Wire watch/check subcommands to the gate library, with a table+JSON
renderer and H6/H7 exit-code mapping. Extend Result with per-rule/global
thresholds and a real skew bound; export SkewHardLimit; reject --states
normal.

* chore: fix goreleaser.yaml and add version command

* chore: implement phase 11 (#2789)

* chore: implement phase 11

Add coverage.go's declared-KeepLast check (no_data_state/exec_err_state,
not just an observed reason) and close the remaining §22 gaps: newly_bad's
no-early-exit clock assertion, a recorder-mode gap right after the deploy,
a rule's own coverage gap overriding its own recovery, a genuinely
skew-discriminating staleness test, exit-2 consequences on two
Reason-only coverage tests, and end-to-end checks for log-name
collapse, a truncated log, and the real watch-written state histogram.

* chore: address code review comments

* chore: more concise comments (#2790)

* chore: more concise comments

* fix: merge conflict

* chore: shorten comments

* fix: resolve conflict

* chore: use testify's require in tests (#2792)

* chore: use testify's require in tests

* chore: move remaining assumptions to testify

* chore: address code review comments

* chore: fix logging and std out printing (#2798)

* chore: fix logging and std out printing

* chore: truncate to seconds when comparing from time

* chore: add centralized docs (#2802)

* chore: add centralized docs

* chore: further update docs

* chore: address code review comments (#2807)

* chore: address code review comments

* chore: get rid of goreleaser
Tofel added a commit that referenced this pull request Sep 9, 2026
* chore: implement phase 4

Add per-rule poll timings, scheduler, and budget check (P4).

- schedule.go: DeriveTimings, Scheduler, CheckBudget (§5)
- Address review: add Folder/Title resolve test, rename
  CheckBudget's minPollEvery to tightestUID

* chore: enhance unit tests

* chore: address code review comments

* chore: implement phase 5 (#2783)

* chore: implement phase 5

Add the JSONL evidence log (P5).

- log.go: Header/Poll records, reduction, H2 transition markers,
  §3.2 verification, append-only Writer with flock, ReadLog
- flock_unix.go: non-blocking exclusive lock, unix only
- schedule.go: DeriveTimingsFromLog — log-mode cadence comes from the
  header, never from the definitions

* chore: remove unix build tags

* chore: address code review comments

* chore: implement phase 6 (#2784)

* chore: implement phase 6

Invariant defended: H2. The one question: can watch return success over a
window that nothing is recording?

Watch() records the first observation of each non-skipped rule, then detaches
a child that polls at the cadence in the header. The parent returns only after
the child reports ready on an inherited pipe, and writes the pidfile after
that. A clean stop writes the sentinel; a hard error does not.

* chore: add a unit test, remove build tags

* chore: address code review comments

* chore: implement phase 7 (#2785)

* chore: implement phase 7

Invariant defended: H3. The one question: can a rule be called alive
because it looked alive one poll ago?

proveCoverage (grafana-alertcheck/internal/gate/coverage.go) is the pure
coverage function: nine checks over one rule's polls — sentinel,
from-bounds, heartbeat continuity, health error/nodata, liveness,
in-window pause, rule absence, KeepLast. Liveness is absolute, never a
delta. Cross-domain comparisons translate by each poll's own skew and
widen boundary segments by its skew bound, fail-closed.

* chore: enhance unit tests

* chore: address code review comments

* chore: implement phase 8 (#2786)

* chore: implement phase 8

Invariant defended: H6/H7. The one question: can a violation ever
outrank an unobservable rule, or can a pass happen without
Violations empty and err nil?

Adds classify.go: the pure per-instance classifier (outcome table,
preexisting policy, BadFor) and decide(), the seam combining
proveCoverage with those timelines under one Policy. Consolidates
rule-poll filtering and skew translation onto pollsForRule/runnerTime,
shared with coverage.go.

* chore: rename some vars + add unit tests

* chore: address code review comments

* chore: implement phase 9 (#2787)

* chore: implement phase 9

Invariant defended: H5/H7. The one question: can check report a pass
over a window it did not prove?

Check() is the I/O shell around the pure decide(). Single-step
synthesizes the header and its own sentinel, so no mode flag reaches
the pure layer. Log mode stops the recorder before the one full read.

The header, not a definition re-resolved after the window closed, is
the authority for what was paused when the window opened — it decides
`skipped`, the drain set, and the transitionGrace max. The flock, not
the pidfile, is the authority for whether a writer still exists.

* chore: remove unix build tag

* chore: implement phase 10 (#2788)

* Wire watch/check subcommands to the gate library, with a table+JSON
renderer and H6/H7 exit-code mapping. Extend Result with per-rule/global
thresholds and a real skew bound; export SkewHardLimit; reject --states
normal.

* chore: fix goreleaser.yaml and add version command

* chore: implement phase 11 (#2789)

* chore: implement phase 11

Add coverage.go's declared-KeepLast check (no_data_state/exec_err_state,
not just an observed reason) and close the remaining §22 gaps: newly_bad's
no-early-exit clock assertion, a recorder-mode gap right after the deploy,
a rule's own coverage gap overriding its own recovery, a genuinely
skew-discriminating staleness test, exit-2 consequences on two
Reason-only coverage tests, and end-to-end checks for log-name
collapse, a truncated log, and the real watch-written state histogram.

* chore: address code review comments

* chore: more concise comments (#2790)

* chore: more concise comments

* fix: merge conflict

* chore: shorten comments

* fix: resolve conflict

* chore: use testify's require in tests (#2792)

* chore: use testify's require in tests

* chore: move remaining assumptions to testify

* chore: address code review comments

* chore: fix logging and std out printing (#2798)

* chore: fix logging and std out printing

* chore: truncate to seconds when comparing from time

* chore: add centralized docs (#2802)

* chore: add centralized docs

* chore: further update docs

* chore: address code review comments (#2807)

* chore: address code review comments

* chore: get rid of goreleaser
Tofel added a commit that referenced this pull request Sep 9, 2026
* chore: implement phase 3

Add Resolve() for alert name resolution (uid:/Title/Folder/Title/
Folder/Group/Title forms, UID collapse, no-match suggestions) and the
grafana-alertcheck CLI's list subcommand, the first runnable piece of
the gate.

Incorporates review fixes: reject empty path segments in classifyForm,
guard uid: against an empty suffix, scope the no-match rule count and
suggestions to supported rule kinds only, and exit 0 on -h/--help.

* chore: enhance unit tests

* chore: implement phase 4 (#2782)

* chore: implement phase 4

Add per-rule poll timings, scheduler, and budget check (P4).

- schedule.go: DeriveTimings, Scheduler, CheckBudget (§5)
- Address review: add Folder/Title resolve test, rename
  CheckBudget's minPollEvery to tightestUID

* chore: enhance unit tests

* chore: address code review comments

* chore: implement phase 5 (#2783)

* chore: implement phase 5

Add the JSONL evidence log (P5).

- log.go: Header/Poll records, reduction, H2 transition markers,
  §3.2 verification, append-only Writer with flock, ReadLog
- flock_unix.go: non-blocking exclusive lock, unix only
- schedule.go: DeriveTimingsFromLog — log-mode cadence comes from the
  header, never from the definitions

* chore: remove unix build tags

* chore: address code review comments

* chore: implement phase 6 (#2784)

* chore: implement phase 6

Invariant defended: H2. The one question: can watch return success over a
window that nothing is recording?

Watch() records the first observation of each non-skipped rule, then detaches
a child that polls at the cadence in the header. The parent returns only after
the child reports ready on an inherited pipe, and writes the pidfile after
that. A clean stop writes the sentinel; a hard error does not.

* chore: add a unit test, remove build tags

* chore: address code review comments

* chore: implement phase 7 (#2785)

* chore: implement phase 7

Invariant defended: H3. The one question: can a rule be called alive
because it looked alive one poll ago?

proveCoverage (grafana-alertcheck/internal/gate/coverage.go) is the pure
coverage function: nine checks over one rule's polls — sentinel,
from-bounds, heartbeat continuity, health error/nodata, liveness,
in-window pause, rule absence, KeepLast. Liveness is absolute, never a
delta. Cross-domain comparisons translate by each poll's own skew and
widen boundary segments by its skew bound, fail-closed.

* chore: enhance unit tests

* chore: address code review comments

* chore: implement phase 8 (#2786)

* chore: implement phase 8

Invariant defended: H6/H7. The one question: can a violation ever
outrank an unobservable rule, or can a pass happen without
Violations empty and err nil?

Adds classify.go: the pure per-instance classifier (outcome table,
preexisting policy, BadFor) and decide(), the seam combining
proveCoverage with those timelines under one Policy. Consolidates
rule-poll filtering and skew translation onto pollsForRule/runnerTime,
shared with coverage.go.

* chore: rename some vars + add unit tests

* chore: address code review comments

* chore: implement phase 9 (#2787)

* chore: implement phase 9

Invariant defended: H5/H7. The one question: can check report a pass
over a window it did not prove?

Check() is the I/O shell around the pure decide(). Single-step
synthesizes the header and its own sentinel, so no mode flag reaches
the pure layer. Log mode stops the recorder before the one full read.

The header, not a definition re-resolved after the window closed, is
the authority for what was paused when the window opened — it decides
`skipped`, the drain set, and the transitionGrace max. The flock, not
the pidfile, is the authority for whether a writer still exists.

* chore: remove unix build tag

* chore: implement phase 10 (#2788)

* Wire watch/check subcommands to the gate library, with a table+JSON
renderer and H6/H7 exit-code mapping. Extend Result with per-rule/global
thresholds and a real skew bound; export SkewHardLimit; reject --states
normal.

* chore: fix goreleaser.yaml and add version command

* chore: implement phase 11 (#2789)

* chore: implement phase 11

Add coverage.go's declared-KeepLast check (no_data_state/exec_err_state,
not just an observed reason) and close the remaining §22 gaps: newly_bad's
no-early-exit clock assertion, a recorder-mode gap right after the deploy,
a rule's own coverage gap overriding its own recovery, a genuinely
skew-discriminating staleness test, exit-2 consequences on two
Reason-only coverage tests, and end-to-end checks for log-name
collapse, a truncated log, and the real watch-written state histogram.

* chore: address code review comments

* chore: more concise comments (#2790)

* chore: more concise comments

* fix: merge conflict

* chore: shorten comments

* fix: resolve conflict

* chore: use testify's require in tests (#2792)

* chore: use testify's require in tests

* chore: move remaining assumptions to testify

* chore: address code review comments

* chore: fix logging and std out printing (#2798)

* chore: fix logging and std out printing

* chore: truncate to seconds when comparing from time

* chore: add centralized docs (#2802)

* chore: add centralized docs

* chore: further update docs

* chore: address code review comments (#2807)

* chore: address code review comments

* chore: get rid of goreleaser
Tofel added a commit that referenced this pull request Sep 9, 2026
* chore: implement phase 2

Fix retry-error conflation, measure full poll latency, and harden Source test doubles for concurrency.

* chore: enhance unit tests

* chore: address code review comments

* chore: implement phase 3 (#2781)

* chore: implement phase 3

Add Resolve() for alert name resolution (uid:/Title/Folder/Title/
Folder/Group/Title forms, UID collapse, no-match suggestions) and the
grafana-alertcheck CLI's list subcommand, the first runnable piece of
the gate.

Incorporates review fixes: reject empty path segments in classifyForm,
guard uid: against an empty suffix, scope the no-match rule count and
suggestions to supported rule kinds only, and exit 0 on -h/--help.

* chore: enhance unit tests

* chore: implement phase 4 (#2782)

* chore: implement phase 4

Add per-rule poll timings, scheduler, and budget check (P4).

- schedule.go: DeriveTimings, Scheduler, CheckBudget (§5)
- Address review: add Folder/Title resolve test, rename
  CheckBudget's minPollEvery to tightestUID

* chore: enhance unit tests

* chore: address code review comments

* chore: implement phase 5 (#2783)

* chore: implement phase 5

Add the JSONL evidence log (P5).

- log.go: Header/Poll records, reduction, H2 transition markers,
  §3.2 verification, append-only Writer with flock, ReadLog
- flock_unix.go: non-blocking exclusive lock, unix only
- schedule.go: DeriveTimingsFromLog — log-mode cadence comes from the
  header, never from the definitions

* chore: remove unix build tags

* chore: address code review comments

* chore: implement phase 6 (#2784)

* chore: implement phase 6

Invariant defended: H2. The one question: can watch return success over a
window that nothing is recording?

Watch() records the first observation of each non-skipped rule, then detaches
a child that polls at the cadence in the header. The parent returns only after
the child reports ready on an inherited pipe, and writes the pidfile after
that. A clean stop writes the sentinel; a hard error does not.

* chore: add a unit test, remove build tags

* chore: address code review comments

* chore: implement phase 7 (#2785)

* chore: implement phase 7

Invariant defended: H3. The one question: can a rule be called alive
because it looked alive one poll ago?

proveCoverage (grafana-alertcheck/internal/gate/coverage.go) is the pure
coverage function: nine checks over one rule's polls — sentinel,
from-bounds, heartbeat continuity, health error/nodata, liveness,
in-window pause, rule absence, KeepLast. Liveness is absolute, never a
delta. Cross-domain comparisons translate by each poll's own skew and
widen boundary segments by its skew bound, fail-closed.

* chore: enhance unit tests

* chore: address code review comments

* chore: implement phase 8 (#2786)

* chore: implement phase 8

Invariant defended: H6/H7. The one question: can a violation ever
outrank an unobservable rule, or can a pass happen without
Violations empty and err nil?

Adds classify.go: the pure per-instance classifier (outcome table,
preexisting policy, BadFor) and decide(), the seam combining
proveCoverage with those timelines under one Policy. Consolidates
rule-poll filtering and skew translation onto pollsForRule/runnerTime,
shared with coverage.go.

* chore: rename some vars + add unit tests

* chore: address code review comments

* chore: implement phase 9 (#2787)

* chore: implement phase 9

Invariant defended: H5/H7. The one question: can check report a pass
over a window it did not prove?

Check() is the I/O shell around the pure decide(). Single-step
synthesizes the header and its own sentinel, so no mode flag reaches
the pure layer. Log mode stops the recorder before the one full read.

The header, not a definition re-resolved after the window closed, is
the authority for what was paused when the window opened — it decides
`skipped`, the drain set, and the transitionGrace max. The flock, not
the pidfile, is the authority for whether a writer still exists.

* chore: remove unix build tag

* chore: implement phase 10 (#2788)

* Wire watch/check subcommands to the gate library, with a table+JSON
renderer and H6/H7 exit-code mapping. Extend Result with per-rule/global
thresholds and a real skew bound; export SkewHardLimit; reject --states
normal.

* chore: fix goreleaser.yaml and add version command

* chore: implement phase 11 (#2789)

* chore: implement phase 11

Add coverage.go's declared-KeepLast check (no_data_state/exec_err_state,
not just an observed reason) and close the remaining §22 gaps: newly_bad's
no-early-exit clock assertion, a recorder-mode gap right after the deploy,
a rule's own coverage gap overriding its own recovery, a genuinely
skew-discriminating staleness test, exit-2 consequences on two
Reason-only coverage tests, and end-to-end checks for log-name
collapse, a truncated log, and the real watch-written state histogram.

* chore: address code review comments

* chore: more concise comments (#2790)

* chore: more concise comments

* fix: merge conflict

* chore: shorten comments

* fix: resolve conflict

* chore: use testify's require in tests (#2792)

* chore: use testify's require in tests

* chore: move remaining assumptions to testify

* chore: address code review comments

* chore: fix logging and std out printing (#2798)

* chore: fix logging and std out printing

* chore: truncate to seconds when comparing from time

* chore: add centralized docs (#2802)

* chore: add centralized docs

* chore: further update docs

* chore: address code review comments (#2807)

* chore: address code review comments

* chore: get rid of goreleaser
Tofel added a commit that referenced this pull request Sep 9, 2026
* chore: implement phase 1

Strict parsers for the state and ruler endpoints (H1), a Prometheus-style
duration parser, and fixtures sliced from real Grafana 13.1.0 payloads
covering every required/optional-field and must-error case, including the
"Normal (NoData)"/"Normal (Error)" composite reason states found live in the
current fleet capture (not in the original plan's vocabulary).

* chore: apply code review comments

* chore: implement phase 2 (#2780)

* chore: implement phase 2

Fix retry-error conflation, measure full poll latency, and harden Source test doubles for concurrency.

* chore: enhance unit tests

* chore: address code review comments

* chore: implement phase 3 (#2781)

* chore: implement phase 3

Add Resolve() for alert name resolution (uid:/Title/Folder/Title/
Folder/Group/Title forms, UID collapse, no-match suggestions) and the
grafana-alertcheck CLI's list subcommand, the first runnable piece of
the gate.

Incorporates review fixes: reject empty path segments in classifyForm,
guard uid: against an empty suffix, scope the no-match rule count and
suggestions to supported rule kinds only, and exit 0 on -h/--help.

* chore: enhance unit tests

* chore: implement phase 4 (#2782)

* chore: implement phase 4

Add per-rule poll timings, scheduler, and budget check (P4).

- schedule.go: DeriveTimings, Scheduler, CheckBudget (§5)
- Address review: add Folder/Title resolve test, rename
  CheckBudget's minPollEvery to tightestUID

* chore: enhance unit tests

* chore: address code review comments

* chore: implement phase 5 (#2783)

* chore: implement phase 5

Add the JSONL evidence log (P5).

- log.go: Header/Poll records, reduction, H2 transition markers,
  §3.2 verification, append-only Writer with flock, ReadLog
- flock_unix.go: non-blocking exclusive lock, unix only
- schedule.go: DeriveTimingsFromLog — log-mode cadence comes from the
  header, never from the definitions

* chore: remove unix build tags

* chore: address code review comments

* chore: implement phase 6 (#2784)

* chore: implement phase 6

Invariant defended: H2. The one question: can watch return success over a
window that nothing is recording?

Watch() records the first observation of each non-skipped rule, then detaches
a child that polls at the cadence in the header. The parent returns only after
the child reports ready on an inherited pipe, and writes the pidfile after
that. A clean stop writes the sentinel; a hard error does not.

* chore: add a unit test, remove build tags

* chore: address code review comments

* chore: implement phase 7 (#2785)

* chore: implement phase 7

Invariant defended: H3. The one question: can a rule be called alive
because it looked alive one poll ago?

proveCoverage (grafana-alertcheck/internal/gate/coverage.go) is the pure
coverage function: nine checks over one rule's polls — sentinel,
from-bounds, heartbeat continuity, health error/nodata, liveness,
in-window pause, rule absence, KeepLast. Liveness is absolute, never a
delta. Cross-domain comparisons translate by each poll's own skew and
widen boundary segments by its skew bound, fail-closed.

* chore: enhance unit tests

* chore: address code review comments

* chore: implement phase 8 (#2786)

* chore: implement phase 8

Invariant defended: H6/H7. The one question: can a violation ever
outrank an unobservable rule, or can a pass happen without
Violations empty and err nil?

Adds classify.go: the pure per-instance classifier (outcome table,
preexisting policy, BadFor) and decide(), the seam combining
proveCoverage with those timelines under one Policy. Consolidates
rule-poll filtering and skew translation onto pollsForRule/runnerTime,
shared with coverage.go.

* chore: rename some vars + add unit tests

* chore: address code review comments

* chore: implement phase 9 (#2787)

* chore: implement phase 9

Invariant defended: H5/H7. The one question: can check report a pass
over a window it did not prove?

Check() is the I/O shell around the pure decide(). Single-step
synthesizes the header and its own sentinel, so no mode flag reaches
the pure layer. Log mode stops the recorder before the one full read.

The header, not a definition re-resolved after the window closed, is
the authority for what was paused when the window opened — it decides
`skipped`, the drain set, and the transitionGrace max. The flock, not
the pidfile, is the authority for whether a writer still exists.

* chore: remove unix build tag

* chore: implement phase 10 (#2788)

* Wire watch/check subcommands to the gate library, with a table+JSON
renderer and H6/H7 exit-code mapping. Extend Result with per-rule/global
thresholds and a real skew bound; export SkewHardLimit; reject --states
normal.

* chore: fix goreleaser.yaml and add version command

* chore: implement phase 11 (#2789)

* chore: implement phase 11

Add coverage.go's declared-KeepLast check (no_data_state/exec_err_state,
not just an observed reason) and close the remaining §22 gaps: newly_bad's
no-early-exit clock assertion, a recorder-mode gap right after the deploy,
a rule's own coverage gap overriding its own recovery, a genuinely
skew-discriminating staleness test, exit-2 consequences on two
Reason-only coverage tests, and end-to-end checks for log-name
collapse, a truncated log, and the real watch-written state histogram.

* chore: address code review comments

* chore: more concise comments (#2790)

* chore: more concise comments

* fix: merge conflict

* chore: shorten comments

* fix: resolve conflict

* chore: use testify's require in tests (#2792)

* chore: use testify's require in tests

* chore: move remaining assumptions to testify

* chore: address code review comments

* chore: fix logging and std out printing (#2798)

* chore: fix logging and std out printing

* chore: truncate to seconds when comparing from time

* chore: add centralized docs (#2802)

* chore: add centralized docs

* chore: further update docs

* chore: address code review comments (#2807)

* chore: address code review comments

* chore: get rid of goreleaser
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants